package com.yuju.util;

import java.text.*;
import java.util.Calendar;
import java.util.Date;

public class Format {

	private static SimpleDateFormat sy = new SimpleDateFormat("yyyy");

	private static SimpleDateFormat sm = new SimpleDateFormat("MM");

	private static SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
	private static SimpleDateFormat sd2 = new SimpleDateFormat("yyyyMMdd");

	private static SimpleDateFormat st = new SimpleDateFormat("HH:mm:ss");

	public static SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private static SimpleDateFormat sdtFull = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
	private static SimpleDateFormat sdtFull2 = new SimpleDateFormat("yyyyMMddHHmmss");

	private static Format fince;

	private static int moneyDecimalLen = 4;

	public Format() {
	}

	public static void init(Format ifince) {
		fince = ifince;
	}

	public static Format getInstance() {
		if (fince == null)
			fince = new Format();
		return fince;
	}

	public static String toyear() {
		return sy.format(new Date());
	}

	public static String tomonth() {
		return sm.format(new Date());
	}

	public static String today() {
		return sd.format(new Date());
	}
	
	public static String todayNoTime() {
		return sd2.format(new Date());
	}

	public static String now() {
		return sdt.format(new Date());
	}
	
	public static String now2() {
		return sdtFull2.format(new Date());
	}

	public static String nowTime() {
		return st.format(new Date());
	}

	public static String getFullTime() {
		return sdtFull.format(new Date());
	}

	public static String getMoney(String s) {
		double visiblerate = 0D;//user.getVisiblerate();
		String money = s;
		try {
			if (visiblerate != 1.0D && money != null && !money.equals(""))
				money = (new Double(visiblerate * Double.parseDouble(money))).toString();
		} catch (Exception exception) {
		}
		money = getNumber(money, getMoneyDecimalLen());
		return money;
	}

	public static int getMoneyDecimalLen() {
		return moneyDecimalLen;
	}

	public static String getNumber(String s, int len) {
		double d = 0.0D;
		try {
			d = (new Double(s)).doubleValue();
		} catch (Exception e) {
			return getNumber("0", len);
		}
		return getNumber(d, len);
	}

	public static String getNumber(float f, int len) {
		return getNumber((double) f, len);
	}

	public static String getNumber(double d, int len) {
		String formatStr = "#0";
		if (len > 0)
			formatStr = formatStr + ".";
		for (int i = 0; i < len; i++)
			formatStr = formatStr + "0";

		return (new DecimalFormat(formatStr)).format(d);
	}

	public static String getInt(String s) {
		return getNumber(s, 0);
	}

	public static String getPercent(String s) {
		double d = 0.0D;
		try {
			d = (new Double(s)).doubleValue() * 100D;
		} catch (Exception e) {
			return "0%";
		}
		return getNumber(d, 2) + "%";
	}

	public static boolean getBoolean(String s) {
		return s != null && (s.toLowerCase().equals("true") || s.toLowerCase().equals("y"));
	}

	public static boolean isNumberType(String dataType) {
		return dataType != null && (dataType.indexOf("number") != -1 || dataType.indexOf("money") != -1
				|| dataType.indexOf("int") != -1 || dataType.indexOf("decimal") != -1 || dataType.equals("percent"));
	}

	public String format(String s, String dataType) {
		if (s == null || s.equals(""))
			return s;
		if (dataType.indexOf("money") != -1)
			return getMoney(s);
		if (dataType.indexOf("int") != -1)
			return getInt(s);
		if (dataType.equals("percent"))
			return getPercent(s);
		else
			return s;
	}

	/**
	 * 功能：替换字符串<br/>
	 * @author xuehj
	 * @param s 原字符串
	 * @param pix 将要替换的字符串
	 * @param rs 要替换成的字符串
	 * @Date 2017年12月5日 上午10:25:43 <br/>
	 */
	public static String replaceAll(String s, String pix, String rs) {
		String newStr = s;
		for (int index = -1; (index = newStr.indexOf(pix)) != -1;) {
			newStr = newStr.substring(0, index) + rs + newStr.substring(index + pix.length());
		}

		return newStr;
	}

	/**
	 * 
	 * 日期加天数、分钟数等<br/>
	 * 用法：Format.dateAdd("2014-12-27", Calendar.DAY_OF_MONTH, -1)
	 * @author xuehj
	 * @param date 
	 * @param field
	 * @param amount
	 * @return 返回指定添加类型、分钟数等日期
	 */

	public static String dateAdd(String date, int field, int amount) {
		Calendar cal = Calendar.getInstance();
		try {
			cal.setTime(sd.parse(date));
		} catch (ParseException e) {
		}
		cal.add(field, amount);
		return sd.format(cal.getTime());
	}

	/**
	 * 
	 * 日期加天数<br/>
	 * 用法：Format.dateAddMinute("2014-12-27", 30)
	 * @author xuehj
	 * @param date 日期字符串
	 * @param amount 分钟数
	 * @return 返回指定分钟数的日期
	 */

	public static String dateAddMinute(String date, int amount) {
		Calendar cal = Calendar.getInstance();
		try {
			cal.setTime(sdt.parse(date));
		} catch (ParseException e) {
		}
		cal.add(Calendar.MINUTE, amount);
		return sdt.format(cal.getTime());
	}

	/**
	 * 日期加分钟数<br/>
	 * 用法：Format.getStrDateAddMinute(new Date(), 30)
	 * @author xuehj
	 * @param date
	 * @param amount 分钟数 如30
	 * @return 返回指定分钟数后的日期字符串
	 */

	public static String getStrDateAddMinute(Date date, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MINUTE, amount);
		return sdt.format(cal.getTime());
	}

	/**
	 * 
	 * 日期加分钟数<br/>
	 * 用法：Format.dateAddMinute(new Date(), 30)
	 * @author xuehj
	 * @param date
	 * @param amount 分钟数 如30
	 * @return 返回指定分钟数后的日期
	 */

	public static Date dateAddMinute(Date date, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MINUTE, amount);
		return cal.getTime();
	}

	/**
	 * 日期加天数
	 * 
	 * @author xuehj
	 * @param dateStr 日期字符串
	 * @param day 天数
	 * @return 加天数后的日期
	 */
	public static String dateAdd(String dateStr, int day) {
		Date date = null;
		try {
			if (null != dateStr)
				date = sdt.parse(dateStr);
			else
				date = new Date();
		} catch (ParseException e) {
			date = new Date();
		}
		Calendar cl = Calendar.getInstance();
		cl.setTime(date);
		cl.add(Calendar.DATE, day);
		return sdt.format(cl.getTime());
	}

	/**
	 * 得到字符串日期的日期对象
	 * 
	 * @param dateStr 字符串日期
	 * @return 日期对象
	 */
	public static Date getDateFromFormatStr(String dateStr) {
		Date date = null;
		try {
			if (null != dateStr)
				date = sdt.parse(dateStr);
		} catch (Exception e) {
			return null;
		}
		return date;
	}
	
	/**
	 * 功能：Date类型转字符串<br/>
	 *
	 * @author xuehj
	 * @Date 2017年9月28日 下午12:27:03 <br/>
	 * @return 返回yyyy-MM-dd HH:mm:ss格式的日期串
	 */
	public static String getDateStr(Date date) {
		return sdt.format(date);
	}
	
	/**
	 * 功能：Date类型转字符串<br/>
	 *
	 * @author xuehj
	 * @Date 2017年9月28日 下午12:27:03 <br/>
	 * @return 返回yyyyMMddHH:mm:ss格式的日期串
	 */
	public static String getDateStr2(Date date) {
		return sdtFull2.format(date);
	}

	public static String nvl(String s) {
		return s != null ? s : "";
	}

	public static String getHTML(String s) {
		if (s != null) {
			s = s.replaceAll("\n", "<BR>");
			s = s.replaceAll("\r", "");
		}
		return s;
	}

	/**
	 * henry
	 * 
	 * @param s
	 * @return
	 */
	public static String getHTML2(String s) {
		if (s != null) {
			s = s.replaceAll("\n", "<BR>");
			s = s.replaceAll("\r", "");
			s = s.replaceAll(" ", "&nbsp;");
		}
		return s;
	}

	/**
	 * henry 用于全理化建议处理
	 * 
	 * @param s
	 * @return
	 */
	public static String getTextFromHTML(String s) {
		if (s != null) {
			s = s.replaceAll("\n", "");
			s = s.replaceAll("\r", "");
			// s = s.replaceAll(" ", "");
			s = s.replaceAll("<BR>", "");
			s = s.replaceAll("'", "");
			s = s.replaceAll("\"", "“");
		}
		return s;
	}

	public static String getHTMLPel(String s) {
		if (s != null) {
			s = s.replaceAll("<", "&lt;");
			s = s.replaceAll(">", "&gt;");
			s = s.replaceAll(" ", "&nbsp;");
			s = s.replaceAll("\"", "&quot;");
		}
		return s;
	}

	public static String getBrowserURL(String s) {
		if (s != null) {
			s = s.replaceAll("&", "%26");
			s = s.replaceAll("\\+", "%2B");
		}
		return s;
	}

	public static String getSQL(String s) {
		if (s != null)
			s = s.replaceAll("'", "''");
		return s;
	}

	public static String getScripString(String s) {
		if (s != null)
			s = s.replaceAll("'", "\\\\'");
		return s;
	}

	public static String replaceParemter(String s, String name, String value) {
		if (value != null)
			s = s.replaceAll("@" + name + "@", value);
		return s;
	}

	/**
	 * java时间戳和PHP时间戳 的转换问题： 由于精度不同，导致长度不一致，直接转换错误。
	 * JAVA时间戳长度是13位，如：1294890876859 PHP时间戳长度是10位， 如：1294890859
	 * 
	 * 主要最后三位的不同，JAVA时间戳在PHP中使用，去掉后三位，如：1294890876859-> 1294890876 结果:2011-01-13
	 * 11:54:36 echo date('Y-m-d H:i:s','1294890876');
	 * PHP时间戳在JAVA中使用，最后加三位，用000补充,如：1294890859->1294890859000 结果:2011-01-13
	 * 11:54:19 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"
	 * ); String dateTime = df.format(1294890859000L); System.out.println(df);
	 * 
	 * @author HENRY
	 * 
	 */
	public static String getNowFromPhpTimestamp(String timestamp) {
		return sdt.format(Long.parseLong(timestamp + "000"));

	}
	
	/**
	 * 功能：得到当前是一周的星期几<br/>
	 *
	 * @author xuehj
	 * @version 2017年3月28日 下午1:54:15 <br/>
	 */
	public static int getDayOfWeek() {
		return Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
	}
	/*public static String getForMatDay(Date date,SimpleDateFormat format) {
		return format.format(date);
	}*/

	public static String getForMatDay(Date date, SimpleDateFormat format) {
		return format.format(date);
	}
	// Format.getForMatDayForFull
	public static String getForMatDayForFull(Date date) {
		return sdt.format(date);
	}

}